import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { store } from '@/store'
import router from '@/router/'

const api = axios.create({
  baseURL: '/admin'
})

// 请求拦截器
api.interceptors.request.use(function (config: AxiosRequestConfig) {
  // 统一设置用户身份 token
  // const { headers: { Authorization } } = config
  // const user = store.state.user
  // if (user && user.token) {
  //   config.headers.Authorization = `Bearer ${user.token}`
  // }
  return config
}, function (error: any) {
  // Do something with request error
  return Promise.reject(error)
})

// 控制登录过期的锁
let isRefreshing = false

// 响应拦截器
api.interceptors.response.use(function (response: AxiosResponse<any>) {
  const {
    data: { status }
  } = response

  // 正确的情况
  if (!status || status === 200) {
    return response
  }

  // 错误情况：比如 token 无效...

  // 统一处理登录过期
  if (status === 410) {
    if (isRefreshing) return Promise.reject(response)
    isRefreshing = true
    // ElMessageBox.confirm('您的登录已过期，您可以取消停留在此页面，或确认重新登录', '登录过期', {
    //   confirmButtonText: '确认',
    //   cancelButtonText: '取消'
    // }).then(() => {
    //   // 清除本地过期的登录状态
    //   store.commit('setUser', null)
    //   // 跳转到登录页面
    //   router.push({
    //     name: 'login',
    //     query: {
    //       redirect: router.currentRoute.value.fullPath
    //     }
    //   })
    //   // 抛出异常
    // }).finally(() => {
    //   isRefreshing = false
    // })

    // 在内部消化掉这个业务异常
    return Promise.reject(response)
  }

  // 其它错误情况
  // ElMessage.error(response.data.msg || '请求失败，请稍后重试')
  // 手动返回一个 Promise 异常
  return Promise.reject(response)
}, function (error: { message: any }) {
  // ElMessage.error(error.message || '请求失败，请稍后重试')
  return Promise.reject(error)
})

export default {
  get<T = any> (config: AxiosRequestConfig): Promise<T> {
    return this.request({ ...config, method: 'GET' })
  },
  post<T = any> (config: AxiosRequestConfig): Promise<T> {
    return this.request({ ...config, method: 'POST' })
  },
  put<T = any> (config: AxiosRequestConfig): Promise<T> {
    return this.request({ ...config, method: 'PUT' })
  },
  delete<T = any> (config: AxiosRequestConfig): Promise<T> {
    return this.request({ ...config, method: 'DELETE' })
  },
  request<T = any> (config: AxiosRequestConfig): Promise<T> {
    return api(config).then((res:any) => {
      return (res.data?.data || res.data) as T
    })
  }
}
